"""量化分析结果的文本格式化工具."""

from __future__ import annotations

import logging
from typing import Dict, List

logger = logging.getLogger(__name__)


def _fmt_value(value: float | None, is_pct: bool = False) -> str:
    if value is None:
        return "N/A"
    try:
        if is_pct:
            return f"{value:.2%}"
        return f"{value:.4f}"
    except (TypeError, ValueError):
        return "N/A"


def format_quant_analysis_text(summary: Dict) -> str:
    """将量化分析 JSON 摘要转换为便于阅读的中文文本."""
    lines: List[str] = []
    lines.append(f"【{summary['symbol']} 量化分析完成报告】")
    lines.append("")

    lines.append("📊 数据信息：")
    data_info = summary.get("data_info", {})
    if data_info:
        lines.append(f"  • 数据时间范围: {data_info.get('start_date', 'N/A')} 至 {data_info.get('end_date', 'N/A')}")
        lines.append(f"  • 总样本数: {data_info.get('total_samples', 0)}")
        lines.append(f"  • 训练集: {data_info.get('train_samples', 0)} 条")
        lines.append(f"  • 验证集: {data_info.get('val_samples', 0)} 条")
        lines.append(f"  • 测试集: {data_info.get('test_samples', 0)} 条")
    lines.append("")

    lines.append("🏆 最佳模型：")
    best_model = summary.get("best_model", "N/A")
    lines.append(f"  • 模型名称: {best_model}")

    backtest_metrics = summary.get("backtest_metrics", {})
    if best_model in backtest_metrics:
        best_metrics = backtest_metrics[best_model]
        lines.append("  • 回测性能指标：")
        if "total_return" in best_metrics:
            total_return = best_metrics["total_return"]
            # 数据验证：确保 total_return 是小数形式（不是百分比）
            # 如果绝对值 > 1.0，可能是百分比形式，需要转换
            if abs(total_return) > 1.0:
                logger.warning(
                    f"检测到 total_return 可能是百分比形式（值={total_return}），"
                    f"已转换为小数形式"
                )
                total_return = total_return / 100.0
            lines.append(f"    - 总收益率: {total_return:.2%}")
        if "annualized_return" in best_metrics:
            annualized_return = best_metrics["annualized_return"]
            # 数据验证：确保 annualized_return 是小数形式
            if abs(annualized_return) > 1.0:
                logger.warning(
                    f"检测到 annualized_return 可能是百分比形式（值={annualized_return}），"
                    f"已转换为小数形式"
                )
                annualized_return = annualized_return / 100.0
            lines.append(f"    - 年化收益率: {annualized_return:.2%}")
        if "sharpe_ratio" in best_metrics:
            lines.append(f"    - 夏普比率: {best_metrics['sharpe_ratio']:.4f}")
        if "max_drawdown" in best_metrics:
            lines.append(f"    - 最大回撤: {best_metrics['max_drawdown']:.2%}")
        if "win_rate" in best_metrics:
            lines.append(f"    - 胜率: {best_metrics['win_rate']:.2%}")
        if "total_trades" in best_metrics:
            lines.append(f"    - 总交易次数: {best_metrics['total_trades']}")
    lines.append("")

    lines.append("📈 基准策略对比：")
    baseline_metrics = summary.get("baseline_metrics", {})
    best_metrics = backtest_metrics.get(best_model, {})

    if baseline_metrics:
        lines.append("  • 买入并持有（基准）表现：")
        lines.append(f"    - 年化收益率: {_fmt_value(baseline_metrics.get('annualized_return'), is_pct=True)}")
        lines.append(f"    - 年化波动率: {_fmt_value(baseline_metrics.get('annualized_volatility'), is_pct=True)}")
        lines.append(f"    - 夏普比率: {_fmt_value(baseline_metrics.get('sharpe_ratio'))}")
        lines.append(f"    - 最大回撤: {_fmt_value(baseline_metrics.get('max_drawdown'), is_pct=True)}")
        lines.append(f"    - 信息比率: {_fmt_value(baseline_metrics.get('information_ratio'))}")

        if best_metrics:
            return_diff = None
            try:
                return_diff = best_metrics.get("annualized_return", 0.0) - baseline_metrics.get("annualized_return", 0.0)
            except TypeError:
                return_diff = None
            lines.append(
                f"  • 年化收益差异（最佳模型 - 基准）: {_fmt_value(return_diff, is_pct=True)}"
            )
    else:
        lines.append("  • 未计算到买入并持有基准指标")
    lines.append("")

    lines.append("🤖 模型评估概览：")
    model_metrics = summary.get("model_metrics", {})
    if model_metrics:
        lines.append(f"  • 训练模型数量: {len(model_metrics)}")
        for model_name, metrics in list(model_metrics.items())[:3]:
            auc = metrics.get("auc", 0)
            accuracy = metrics.get("accuracy", 0)
            lines.append(f"  • {model_name}: AUC={auc:.4f}, 准确率={accuracy:.2%}")
        if len(model_metrics) > 3:
            lines.append(f"  ... 还有 {len(model_metrics) - 3} 个模型")
    lines.append("")

    warnings = summary.get("overfitting_warnings", {})
    lines.append("⚠️ 过拟合与稳定性监控：")
    if warnings:
        for model_name, info in warnings.items():
            severity = info.get("severity", "未知")
            trigger = (info.get("triggers") or ["未提供"])[0]
            lines.append(f"  • {model_name}: {severity} → {trigger}")
            lc_alerts = info.get("learning_curve_alerts") or []
            if lc_alerts:
                lines.append(f"    - 学习曲线: {lc_alerts[0]}")
            cv_info = info.get("time_series_cv", {})
            if cv_info and not cv_info.get("skipped"):
                cv_alerts = cv_info.get("alerts") or []
                if cv_alerts:
                    lines.append(f"    - 时间序列 CV: {cv_alerts[0]}")
    else:
        lines.append("  • 未检测到明显过拟合风险")
    lines.append("")

    # 模型选择说明和改进建议
    model_metrics = summary.get("model_metrics", {})
    best_model = summary.get("best_model", "N/A")
    
    # 检查是否所有模型都过拟合
    all_overfitting = all(
        model_metrics.get(m, {}).get("is_overfitting", False)
        for m in model_metrics.keys()
    ) if model_metrics else False
    
    if all_overfitting:
        lines.append("⚠️ 重要警告：")
        lines.append("  • 所有模型都存在过拟合风险")
        lines.append("  • 模型选择逻辑：")
        lines.append("    - 已设置验证集AUC最低阈值（0.55），低于此值的模型被排除")
        lines.append("    - 在所有过拟合模型中，选择过拟合程度最低的模型")
        lines.append("    - 评分公式优先考虑验证集AUC，其次考虑回测指标")
        lines.append("  • 改进建议：")
        lines.append("    - 减少特征数量（当前可能过多）")
        lines.append("    - 增加训练数据量")
        lines.append("    - 调整模型超参数（增加正则化、减少模型复杂度）")
        lines.append("    - 使用特征选择技术")
        lines.append("    - 考虑使用集成方法")
        lines.append("")
    elif best_model != "N/A" and best_model in model_metrics:
        # 即使不是所有模型都过拟合，也说明选择逻辑
        best_model_metrics = model_metrics.get(best_model, {})
        is_overfitting = best_model_metrics.get("is_overfitting", False)
        val_auc = best_model_metrics.get("auc", 0.0)
        
        lines.append("ℹ️ 模型选择说明：")
        if is_overfitting:
            lines.append(f"  • 最佳模型 {best_model} 存在过拟合风险（验证集AUC={val_auc:.4f}）")
            lines.append("  • 建议谨慎使用，并考虑改进模型")
        else:
            lines.append(f"  • 最佳模型 {best_model} 已通过过拟合检测（验证集AUC={val_auc:.4f}）")
            lines.append("  • 模型选择基于验证集AUC和回测指标的综合评分")
        lines.append("")

    lines.append("🔬 稳健性分析：")
    robustness = summary.get("robustness", {})
    if robustness:
        stability = robustness.get("model_stability", "N/A")
        param_robustness = robustness.get("parameter_robustness", "N/A")
        lines.append(f"  • 模型稳定性: {stability}")
        lines.append(f"  • 参数稳健性: {param_robustness}")
    lines.append("")

    lines.append("💡 提示：")
    lines.append(f"  • 最佳模型 '{best_model}' 已保存，可用于预测")
    lines.append("  • 可以使用 model_prediction_tool 进行实时预测")
    lines.append("  • 建议结合风险分析结果进行综合判断")

    return "\n".join(lines)

